package org.lumberjack.server; import org.jboss.netty.bootstrap.ServerBootstrap; import org.jboss.netty.channel.ChannelPipeline; import org.jboss.netty.channel.ChannelPipelineFactory; import org.jboss.netty.channel.DefaultChannelPipeline; import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory; import org.jboss.netty.handler.ssl.SslHandler; import org.slf4j.LoggerFactory; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLEngine; import java.io.FileInputStream; import java.io.IOException; import java.net.InetSocketAddress; import java.security.GeneralSecurityException; import java.security.KeyStore; import java.util.concurrent.Executors; /** * Created on 7/4/15. */ public class LumberjackServer { private ServerBootstrap bootstrap; private LogEventListener eventListener; private ServerConfiguration configuration; private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(LumberjackServer.class); public LumberjackServer(ServerConfiguration configuration, LogEventListener eventListener) { this.configuration = configuration; this.eventListener = eventListener; } public void start() { bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory( Executors.newFixedThreadPool(1), Executors.newCachedThreadPool() )); bootstrap.setPipelineFactory(new ChannelPipelineFactory() { public ChannelPipeline getPipeline() throws Exception { ChannelPipeline pipeline = new DefaultChannelPipeline(); pipeline.addLast("ssl", new SslHandler(getSSLEngine())); pipeline.addLast("decoder", new LumberjackDecoder()); pipeline.addLast("logHandler", new LogEventHandler(eventListener)); return pipeline; } }); bootstrap.bind(new InetSocketAddress(configuration.getIpAddress(), configuration.getPort())); } private SSLEngine getSSLEngine() throws GeneralSecurityException, IOException { SSLContext context; char[] storepass = configuration.getKeyStorePass().toCharArray(); char[] keypass = configuration.getKeyPass().toCharArray(); String storePath = configuration.getKeyStorePath(); try { context = SSLContext.getInstance("TLS"); KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); FileInputStream fin = new FileInputStream(storePath); KeyStore ks = KeyStore.getInstance("JKS"); ks.load(fin, storepass); kmf.init(ks, keypass); context.init(kmf.getKeyManagers(), null, null); } catch (GeneralSecurityException | IOException e) { //e.printStackTrace(); LOGGER.warn("Exception while creating channel pipeline",e); throw e; } SSLEngine engine = context.createSSLEngine(); engine.setUseClientMode(false); return engine; } public void stop() { bootstrap.shutdown(); } }